package com.ydj.framework.utils;

import com.ydj.framework.mysql.PageArgs;

import java.util.ArrayList;
import java.util.List;

/**
 * List 分页工具类
 *
 * @author Max
 */
public final class ListPageUtils {
	/**
	 * List 分页，并配置 PageArgs 里的分页信息
	 *
	 * @param list      要分页的 List
	 * @param page      当前页
	 * @param pageSize  每页内容数
	 * @return list     分好页的 List
	 */
    public static <T> List<T> page(List<T> list, int page, int pageSize) {
	    if (list == null || list.isEmpty()) {
		    return list;
	    }

	    int totalSize = list.size();
	    // 截取 List
	    int fromIndex = (page - 1) * pageSize;
	    int toIndex = page * pageSize > totalSize ? totalSize : page * pageSize;
	    // 开始下标大于结束下标则返回空集合
	    if (fromIndex > toIndex) {
		    return new ArrayList<>();
	    }
	    return list.subList(fromIndex, toIndex);
    }

	/**
	 * List 分页，并配置 PageArgs 里的分页信息
	 *
	 * @param list      要分页的 List
	 * @param pageArgs  分页信息
	 * @return list     分好页的 List
	 */
	public static <T> List<T> pageWithPageArgs(List<T> list, PageArgs pageArgs) {
		if (list == null || list.isEmpty()) {
			pageArgs.setTotalSize(0L);
			pageArgs.setTotalPage(0L);
			return list;
		}

		// 计算总页数和总内容数
		int pageSize = pageArgs.getPageSize().intValue();
		int page = pageArgs.getPage().intValue();
		int totalSize = list.size();
		int totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
		pageArgs.setTotalSize((long) totalSize);
		pageArgs.setTotalPage((long) totalPage);

		// 截取 List
		int fromIndex = (page - 1) * pageSize;
		int toIndex = page * pageSize > totalSize ? totalSize : page * pageSize;
		// 开始下标大于结束下标则返回空集合
		if (fromIndex > toIndex) {
			return new ArrayList<>();
		}
		return list.subList(fromIndex, toIndex);
	}

	/**
	 * List 分页，并配置 PageArgs 里的分页信息
	 *
	 * @param list1     要整合的第一个 List
	 * @param list2     要整合的第二个 List
	 * @param pageArgs  分页信息
	 * @return list     分好页的 List
	 */
	public static <T> List<T> pageWithPageArgs(List<T> list1, List<T> list2, PageArgs pageArgs) {
		List<T> list = new ArrayList<>();
		list.addAll(list1);
		list.addAll(list2);
		return pageWithPageArgs(list, pageArgs);
	}
}